package com.qfedu.edu.seckill.aop;

import com.qfedu.edu.seckill.result.R;
import com.qfedu.edu.seckill.result.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author xiaobobo
 * @title: ResultHandlerAop
 * @projectName cd-java-2404-seckill-parent
 * @description: 结果集处理的这个AOP
 * <p>
 * 那么产生了 服务之间的调用 那么我们这个AOP就使用到哪里
 * @date 2025/1/13  15:31
 */
@Aspect     //表示是一个切面类
@Slf4j
@Component
public class ResultHandlerAop {

    /**
     * 这个类只要是拥有 FeignClient这个注解的话 那么这个类 就是我们关注的类
     * 这个类中的所有的方法我们都需要去拦截 处理
     */
    @Pointcut("@within(org.springframework.cloud.openfeign.FeignClient)")
    public void pt() {
    }

    /**
     * 环绕处理这个请求就可以了
     *
     * @param proceedingJoinPoint
     * @return
     */
    @Around("pt()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("执行到了AOP这个位置来.....");
        try {
            Object proceed = proceedingJoinPoint.proceed();
            R r= (R) proceed;
            if(r.getCode()!=0){
               //也是为了让事务回滚
               throw new RuntimeException(ResponseCode.SERVER_REQ_EXCEPTION.getMsg());
            }else {
                return r;
            }
        } catch (Exception err) {
            //直接抛出异常 让事务回滚
            throw new RuntimeException(err);
        }
    }
}
